---
id: unit4
title: 第四章 进程同步与互斥
---
## 进程间相互作用
**相关进程和无关进程：**  
在逻辑上具有某种联系的进程称为相关进程，在逻辑上没有任何联系的进程称为无关进程。并发进程相互之间可能是无关的，也可能是相关的。

## 进程的同步与互斥
**进程的同步：**  
是指进程之间一种直接的协同工作关系，一些进程相互合作，共同完成一项任务。

**进程的互斥：**  
在系统中，许多进程常常需要共享资源，而这些资源往往要求排他性的使用，即一次只能为一个进程服务，因此，各进程间只能互斥使用这些资源，进程间的这种关系就是进程的互斥。


**临界区：**  
若在系统中某些资源一次只允许一个进程使用，则这类资源成为临界资源或共享变量，而在进程中访问临界资源的程序称为临界区。

**相关临界区**  
如果有若干进程共享某一临界区，则该临界区称为相关临界区。

**系统对相关临界区的调度使用原则归纳如下：**  
（1）当临界区为空时，若有一个进程要求进入临界区，应允许它立即进人临界区-有空让进。  
（2）若有一个进程已在临界区时，其他要求进入临界区的进程必须等待-无空等待。  
（3）当没有进程在临界区，而同时有多个进程要求进人临界区，只能让其中之一进人临界区，其他进程必须等待-多中择一。  
（4）任一进程进入临界区的要求应在有限时间满足-有限等待。  
（5）处于等待状态的进程应放弃占用处理器-让权等待。  

## 信号量及P、V操作
信号量是一种特殊的变量，它的表面形式是一个整型变量附加一个队列；而且，它只能被特殊的操作（即P操作和V操作）使用。P操作和V操作都是原语。

设信号量为S，S可以取不同的整数值。对信号量S实施的P操作和V操作，可分别用P（S）和V（S）表示。
［综合］P操作和V操作定义：
```

P(S)
{
S=S-1;
若S＜0，将该进程状态置为等待状态，然后将该进程的PCB插入相应的S信号量等待队列末尾，直到有其他进程在S上执行V操作为止；
}
V(S)
}
S=S+1;
若S≤0，释放在S信号量队列中等待的一个进程，将其状态改变为就绪态，并将其插人就绪队列；然后，执行本操作的进程继续执行；
}

**用P、V操作实现进程之间的互斥：**   
假设有进程A、B竞争进入临界区，用P、V操作实现进程之间的互斥的程序可以写成：
进程A进程B
P(S);P(S);
临界区操作；
临界区操作；
V(S);
V(S);
其中，S的初值为1。
［综合］用P、V操作实现进程之间的同步：
考虑一种同步关系，其中有两个信号量S1，和S2，赋予它们的初值均为0，S1，表示在一个缓冲区中是否装满信息，S2表示该缓冲区中信息是否取走。程序可写成：
进程A
进程B
..
while(true){while(true){
把信息送人缓冲区；
P(S1);
V(S);
把信息送入缓冲区；
P(S2);
V(S2);
);
};
```

## 经典的进程同步问题
**经典的进程同步问题：**  
（1）简单生产者-消费者问题。  
（2）多个生产者-消费者问题。  
（3）读者-写者问题。  

## 管程
**管程的概念及组成：**
一个管程是一个由过程、变量及数据结构等组成的一个集合，它们组成一个特殊的模块或软件包。  
一个管程由四个部分组成，它们是管程名称、共享数据的说明、对数据进行操作的一组过程和对共享数据赋初值的语句。

**管程具有三个主要的特性：**  
模块化、抽象数据类型、信息隐蔽。

## 进程通信
**解决进程之间的大量信息通信的问题有三类方案：**  
共享内存、消息机制以及通过共享文件进行通信，即管道通信。
（1）共享内存。
（2）消息机制。包括消息缓冲通信、信箱通信和管道通信。
